﻿/*
过原点的直线数 
Time Limit:1000MS  Memory Limit:32768K

  
Description:
给定平面上P个点(0< P < 70000)，每个点的坐标均为整数，且0<=X,Y<1000。
求整个平面可以构造出多少条过点(0,0)的直线。没有任意两点具有相同坐标。

Input:
输入第一行为N，表示测试数据的组数。接下来有N组测试数据。每组测试数据第一行为P，接下P行每行2个整数，分别指定了该点的坐标X、Y值。 
Output:
输出为N行，每行一个整数，表明该组测试数据存在过点(0,0)直线的条数。 
Sample Input:
1
5
1 1
2 2
0 1
1 0
3 3
Sample Output:
3
Hint:
第一条直线过 (0,0) (1,0)；第二条直线过(0,0) (1,1) (2,2) (3,3)；第三条直线过(0,0) (0,1)。
*/
/*
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct Comparator
{
	bool operator()(double x, double y)
	{
		return (x-y)<(1e-6);
	}
}comparator;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int p;
		cin>>p;
		vector<double> pts;
		pts.reserve(p);

		int horizontal=0, vertical=0;

		while(p--)
		{
			int x, y;
			cin>>x>>y;
			if(0==x)
				horizontal=1;
			else if(0==y)
				vertical=1;
			else {	//取相对坐标(0,0)的斜率
				pts.push_back(1.0*y/x);
			}			
		}

		sort(pts.begin(), pts.end(), comparator);

		vector<double>::iterator end = unique(pts.begin(), pts.end());
		int in_line = unique(pts.begin(), pts.end())-pts.begin();
		in_line += vertical + horizontal;
		cout<<in_line<<endl;
	}

	return 0;
}
*/
#include <iostream>
#include <set>
using namespace std;
static const double NaN = 1e6;
int main(int argc, char* argv[])
{
	unsigned n;
	set<double> slopes;
	cin >> n;
	while (n--)
	{
		unsigned p;
		cin >> p;
		while (p--)
		{
			int x, y;
			cin >> x >> y;
			if (x)
				slopes.insert(1.0 * x / y);
			else
				slopes.insert(NaN);
		}
		cout << slopes.size() << endl;
	}
	return 0;
}